define('gallery/upload/0.0.1/upload-debug',["$", "widget", "base", "class", "events","easing"],function(require, exports, module){
    var $ = require('$');
    var Widget = require('widget');
    
    function getError(action,option,xhr){
        var msg = 'cannot post' + action + xhr.status;
        var err = new Error(msg);
        err.status = xhr.status;
        err.method = 'post';
        err.url = action;
        return err;
    }

    function getBody(xhr){
        var text = xhr.responseText || xhr.response;
        if(!text){
            return text;
        }

        try {
            return JSON.parse(text);
        } catch (error) {
            return text;
        }
    }

    function upload(option){
        if(typeof XMLHttpRequest === 'undefined'){
            return ;
        }

        var xhr = new XMLHttpRequest();
        var action = option.action;

        if(xhr.upload){
            xhr.upload.onprogress = function(e){
                if(e.total > 0){
                    e.percent = e.loaded / e.total * 100;
                }
                option.onProgress(e);
            }
        }

        var formData = new FormData();

        if(option.data){
            Object.keys(option.data).map(key => {
                formData.append(key,option.data[key]);
            });
        }

        formData.append(option.filename,option.file);
        
        xhr.onerror = function error(e){
            option.onError(e);
        }

        xhr.onload = function onload(){
            if(xhr.status < 200 || xhr.status >= 300){
                return option.onError(getError(action,option,xhr),getBody(xhr));
            }
            option.onSuccess(getBody(xhr));
        }

        xhr.open('post',action,true);

        if(option.withCredentials && 'withCredential' in xhr){
            xhr.withCredentials = true;
        }

        var headers = option.headers || {};

        if(headers['X-Requested-With'] !== null){
            xhr.setRequestHeader('X-Requested-With','XMLHtppRequest');
        }

        for(var item in headers){
            if(headers.hasOwnProperty(item) && headers[item] !== null){
                xhr.setRequestHeader(item,headers[item]);
            }
        }
        xhr.send(formData);
    }

    var Upload = Widget.extend({
        attrs:{
            triggers:{
                value:'.upload',
                getter:function(val){
                    return $(val);
                }
            }
        }
    });

    module.exports = Upload;
});